home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / GAMESDS3.DMS / GAMESDS3.adf / GDS_Examples.lha / Examples / sound / snd_na.c < prev    next >
C/C++ Source or Header  |  1994-11-14  |  5KB  |  154 lines

  1. /* this version does not allocate the Amiga sound channels in a system
  2.    friendly way.  It just uses 'em.
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <dos.h>
  9. #include <signal.h>
  10. #include <proto/exec.h>
  11.  
  12. #include <GameSmith:include/libraries/libraries.h>
  13. #include <GameSmith:include/libraries/libptrs.h>
  14. #include <GameSmith:include/sound/sound.h>
  15. #include <GameSmith:include/proto/all.h>
  16.  
  17. void ctrl_c(int);
  18.  
  19. struct sound_struct sample1,sample2;   /* 2 structs in case of stereo sample */
  20. int stop=0;                        /* ctrl-C break flag */
  21.  
  22. /***************************************************************************/
  23.  
  24. main(argc,argv)
  25. int argc;
  26. char *argv[];
  27.  
  28. {
  29.    int err,echo,temp,old_prio;
  30.  
  31.    if (argc < 2)
  32.       {
  33.       printf("\nUsage: SND file_name [loop value] [echo divisor] [volume cnt]\n");
  34.       printf("           [volume decrement] [period cnt] [period decrement] [period]\n");
  35.       exit(01);
  36.       }
  37.    signal(SIGINT,&ctrl_c);         /* set up break handler ANSI style */
  38.    sample1.flags=SND_FAST;         /* load sample to Fast RAM if available */
  39.    sample2.flags=SND_FAST;
  40.    if (gs_open_libs(DOS|GRAPHICS,0)) /* need DOS for reading file, and Graphics */
  41.       exit(02);                  /* sound sys uses Graphics lib to determine */
  42.                                  /* whether a PAL or NTSC machine for timing */
  43.    if (err=gs_load_iff_sound(&sample1,&sample2,argv[1]))
  44.       {
  45.       if (err == -4)               /* If not IFF, try to load raw */
  46.          {
  47.          if (err=gs_load_raw_sound(&sample1,argv[1]))
  48.             {
  49.             printf("\nError loading raw sample.  Code = %d\n",err);
  50.             gs_close_libs();
  51.             exit(03);
  52.             }
  53.          else
  54.             printf("\n%s - Raw Sample\n\n",argv[1]);
  55.          }
  56.       else if (err == -7)         /* if couldn't load 2nd channel */
  57.          {
  58.          printf("\nUnable to load 2nd sound channel for stereo play\n");
  59.          }
  60.       else
  61.          {
  62.          printf("\nError loading IFF sample.  Code = %d\n",err);
  63.          gs_close_libs();
  64.          exit(03);
  65.          }
  66.       }
  67.    else
  68.       {
  69.       if (sample2.data)
  70.          printf("\n%s - IFF 8SVX Stereo Sample ({<*>})\n\n",argv[1]);
  71.       else
  72.          printf("\n%s - IFF 8SVX Mono Sample\n\n",argv[1]);
  73.       }
  74.    if (argc >= 3)                  /* check for repeat value */
  75.       {
  76.       sample1.repeat=atoi(argv[2]);
  77.       sample2.repeat=atoi(argv[2]);
  78.       }
  79.    if (argc >= 4)                  /* check for echo divisor */
  80.       {
  81.       echo=atoi(argv[3]);
  82.       if (echo > 1)
  83.          {
  84.          temp=sample1.length/echo;
  85.          if (temp)
  86.             {
  87.             sample1.loop=sample1.data+((sample1.length-temp)*2);
  88.             sample2.loop=sample2.data+((sample2.length-temp)*2);
  89.             }
  90.          }
  91.       }
  92.    if (argc >= 5)                  /* check for volume count */
  93.       {
  94.       sample1.volcnt=atoi(argv[4]);
  95.       sample2.volcnt=atoi(argv[4]);
  96.       }
  97.    if (argc >= 6)                  /* check for volume decrement */
  98.       {
  99.       sample1.volfade=atoi(argv[5]);
  100.       sample2.volfade=atoi(argv[5]);
  101.       }
  102.    if (argc >= 7)                  /* check for period count */
  103.       {
  104.       sample1.percnt=atoi(argv[6]);
  105.       sample2.percnt=atoi(argv[6]);
  106.       }
  107.    if (argc >= 8)                  /* check for period decrement */
  108.       {
  109.       sample1.perfade=atoi(argv[7]);
  110.       sample2.perfade=atoi(argv[7]);
  111.       }
  112.    if (argc >= 9)                  /* check for new period value */
  113.       {
  114.       sample1.period=atoi(argv[8]);
  115.       sample2.period=atoi(argv[8]);
  116.       }
  117.    if (gs_open_sound(0,0,0,(4096/2)))   /* open sound system, don't alloc channels */
  118.       {
  119.       gs_free_sound(&sample1);
  120.       if (sample2.data)
  121.          gs_free_sound(&sample2);
  122.       printf("\nError opening sound system\n");
  123.       gs_close_libs();
  124.       exit(04);
  125.       }
  126.    Disable();               /* in case need to sync 2 channels */
  127.    gs_start_sound(&sample1,CHANNEL0);
  128.    if (sample2.data)         /* check if need to start 2nd channel @ same time */
  129.       gs_start_sound(&sample2,CHANNEL1);
  130.    else
  131.       gs_start_sound(&sample1,CHANNEL1);
  132.    Enable();               /* reenable interrupts */
  133.    old_prio=gs_task_prio(-128);            /* lowest priority while sample plays */
  134.    while ((gs_sound_check()) && (!stop))   /* wait for all channels idle */
  135.       chkabort();                           /* and check for abort signal */
  136.    gs_task_prio(old_prio);
  137.    gs_stop_sound(CHANNEL0);               /* stop all sounds (if still active) */
  138.    gs_stop_sound(CHANNEL1);
  139.    gs_close_sound();                        /* shut down sound system */
  140.    gs_free_sound(&sample1);               /* release sound data when done */
  141.    if (sample2.data)
  142.       gs_free_sound(&sample2);
  143.    gs_close_libs();                        /* close libs and end */
  144. }
  145.  
  146. /***************************************************************************/
  147.  
  148. void ctrl_c(signal)         /* ctrl-C handling ANSI fashion (SAS/C 6.xx) */
  149. int signal;
  150.  
  151. {
  152.    stop=1;                  /* set flag to quit */
  153. }
  154.